The present invention relates to software used in computer systems, and more particularly to software used in a managed runtime environment.
Certain modern programming languages execute in a managed runtime environment (MRTE) and provide automatic memory management and dynamic loading facilities, among other features. MRTEs dynamically load and execute code that is delivered in a portable format. Thus, the code must be converted into native instructions via interpretation or compilation.
Managed code is thus an image created when source code is compiled using a managed environment-compliant compiler, such as a Microsoft .NET framework-compliant compiler or a JAVA™-compliant compiler. Managed code can be a managed assembly that either can be a dynamically linked library (DLL) or a portable executable (PE) file. The managed DLL or PE file includes an intermediate language representation, such as Microsoft intermediate language (MSIL) code or JAVA™ bytecodes, and metadata. Metadata is information used by a common language runtime (CLR) to handle security and memory operations.
In contrast, unmanaged code is an image created when source code is compiled using a native compiler to create a native binary for underlying platform hardware, e.g., a processor. In contrast to managed code, the unmanaged code can be optimized for a given processor, allowing greater performance than managed code, which is typically abstracted away from hardware specifics.
Significant amounts of legacy code exist. Generally, this code is unmanaged code written in different unmanaged languages, such as C, C++ or the like. To use this legacy code in a managed environment, a developer has to take the legacy libraries and hand code managed-to-native interoperability code to allow the native code to be used in a managed environment. Alternately, a developer is forced to design complex tools to allow use of native code in a managed environment.
The complexity includes additional development efforts required to describe the native routine interface, leaving a significant burden to a developer. In addition, a developer must create an additional managed code program (e.g., a C# program) to describe the prototype of the methods in the native libraries. The extra managed code program must then be compiled by a managed code compiler to generate a managed interface, and the legacy libraries must be compiled by a native compiler to generate native compiled code. Accordingly, two DLLs exist. Furthermore, interoperability code, such as a platform invoke mechanism, is required to link these two DLLs.
Accordingly, a need exists to reduce the complexity of using native code in a managed environment.